/**
 * 显示固定位数的数字。
 * @param {Number} bits 固定的位数
 * @param {String} padChar 位数不足补充的字符
 * @returns {String} 固定位数的数字。 
 */
Number.prototype.leftPad = function (bits, padChar) {
    padChar = padChar || '0';

    var bitsArray = [padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar, padChar];
    var length = this.toFixed(0).toString().length;

    return (length >= bits) ? this : bitsArray.slice(0, bits - length).join('') + this;
};

/**
 * 对象比较。
 * @param {Object} target 被比较的对象
 * @param {Array<String>} ignores 忽略的对象属性列表
 * @returns {Boolean} 是否相等
 */
Object.prototype.compare = function (target, ignores) {
    let sourceProps = Object.getOwnPropertyNames(this);
    let targetProps = Object.getOwnPropertyNames(target);

    if (sourceProps.length != targetProps.length) {
        return false;
    }

    for (let index = 0; index < sourceProps.length; index++) {
        let propName = sourceProps[index];

        if (ignores && ignores.find(i => i.toLowerCase() == propName.toLowerCase())) {
            continue;
        }

        if(typeof this[propName] != 'string' && this[propName] != target[propName]){
            return false;
        } else if (typeof this[propName] != "string" && this[propName] == target[propName]){
            continue;
        }else if ((this[propName] || "").toLowerCase() != (target[propName] || "").toLowerCase()) {
          return false;
        }
    }

    return true;
}

/**
 * 获取不在数组中的数据。
 * @param {Array} targets 目标数组。
 * @param {Array<String>} ignores 忽略比较的属性。
 * @returns {Array} 不包含在源数组中的元素。
 */
Array.prototype.getNotIncludes = function (targets, ignores) {
    if (typeof (this[0]) !== 'object') {
        return null;
    }

    if (!Array.isArray(targets)) {
        return null;
    }

    if (targets.length == 0) {
        return this;
    }

    let self = this;
    let notIncludes = [];

    self.forEach(function (t) {
        if (!targets.find(s => s.compare(t, ignores))) {
            notIncludes.push(t);
        }
    });

    return notIncludes;
}